1 /*
2 * Copyright (C) 2007 The Guava Authors
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17 package com.google.common.collect;
18
19 import static com.google.common.base.Preconditions.checkArgument;
20 import static com.google.common.base.Preconditions.checkNotNull;
21 import static com.google.common.base.Preconditions.checkState;
22 import static com.google.common.base.Predicates.equalTo;
23 import static com.google.common.base.Predicates.in;
24 import static com.google.common.base.Predicates.not;
25 import static com.google.common.collect.CollectPreconditions.checkRemove;
26
27 import com.google.common.annotations.Beta;
28 import com.google.common.annotations.GwtCompatible;
29 import com.google.common.base.Function;
30 import com.google.common.base.Objects;
31 import com.google.common.base.Optional;
32 import com.google.common.base.Preconditions;
33 import com.google.common.base.Predicate;
34
35 import java.util.Arrays;
36 import java.util.Collection;
37 import java.util.Collections;
38 import java.util.Comparator;
39 import java.util.Enumeration;
40 import java.util.Iterator;
41 import java.util.List;
42 import java.util.ListIterator;
43 import java.util.NoSuchElementException;
44 import java.util.PriorityQueue;
45 import java.util.Queue;
46
47 import javax.annotation.Nullable;
48
49 /**
50 * This class contains static utility methods that operate on or return objects
51 * of type {@link Iterator}. Except as noted, each method has a corresponding
52 * {@link Iterable}-based method in the {@link Iterables} class.
53 *
54 * <p><i>Performance notes:</i> Unless otherwise noted, all of the iterators
55 * produced in this class are <i>lazy</i>, which means that they only advance
56 * the backing iteration when absolutely necessary.
57 *
58 * <p>See the Guava User Guide section on <a href=
59 * "http://code.google.com/p/guava-libraries/wiki/CollectionUtilitiesExplained#Iterables">
60 * {@code Iterators}</a>.
61 *
62 * @author Kevin Bourrillion
63 * @author Jared Levy
64 * @since 2.0 (imported from Google Collections Library)
65 */
66 @GwtCompatible(emulated = true)
67 public final class Iterators {
68 private Iterators() {}
69
70 static final UnmodifiableListIterator<Object> EMPTY_LIST_ITERATOR
71 = new UnmodifiableListIterator<Object>() {
72 @Override
73 public boolean hasNext() {
74 return false;
75 }
76 @Override
77 public Object next() {
78 throw new NoSuchElementException();
79 }
80 @Override
81 public boolean hasPrevious() {
82 return false;
83 }
84 @Override
85 public Object previous() {
86 throw new NoSuchElementException();
87 }
88 @Override
89 public int nextIndex() {
90 return 0;
91 }
92 @Override
93 public int previousIndex() {
94 return -1;
95 }
96 };
97
98 /**
99 * Returns the empty iterator.
100 *
101 * <p>The {@link Iterable} equivalent of this method is {@link
102 * ImmutableSet#of()}.
103 *
104 * @deprecated Use {@code ImmutableSet.<T>of().iterator()} instead; or for
105 * Java 7 or later, {@link Collections#emptyIterator}. This method is
106 * scheduled for removal in May 2016.
107 */
108 @Deprecated
109 public static <T> UnmodifiableIterator<T> emptyIterator() {
110 return emptyListIterator();
111 }
112
113 /**
114 * Returns the empty iterator.
115 *
116 * <p>The {@link Iterable} equivalent of this method is {@link
117 * ImmutableSet#of()}.
118 */
119 // Casting to any type is safe since there are no actual elements.
120 @SuppressWarnings("unchecked")
121 static <T> UnmodifiableListIterator<T> emptyListIterator() {
122 return (UnmodifiableListIterator<T>) EMPTY_LIST_ITERATOR;
123 }
124
125 private static final Iterator<Object> EMPTY_MODIFIABLE_ITERATOR =
126 new Iterator<Object>() {
127 @Override public boolean hasNext() {
128 return false;
129 }
130
131 @Override public Object next() {
132 throw new NoSuchElementException();
133 }
134
135 @Override public void remove() {
136 checkRemove(false);
137 }
138 };
139
140 /**
141 * Returns the empty {@code Iterator} that throws
142 * {@link IllegalStateException} instead of
143 * {@link UnsupportedOperationException} on a call to
144 * {@link Iterator#remove()}.
145 */
146 // Casting to any type is safe since there are no actual elements.
147 @SuppressWarnings("unchecked")
148 static <T> Iterator<T> emptyModifiableIterator() {
149 return (Iterator<T>) EMPTY_MODIFIABLE_ITERATOR;
150 }
151
152 /** Returns an unmodifiable view of {@code iterator}. */
153 public static <T> UnmodifiableIterator<T> unmodifiableIterator(
154 final Iterator<T> iterator) {
155 checkNotNull(iterator);
156 if (iterator instanceof UnmodifiableIterator) {
157 return (UnmodifiableIterator<T>) iterator;
158 }
159 return new UnmodifiableIterator<T>() {
160 @Override
161 public boolean hasNext() {
162 return iterator.hasNext();
163 }
164 @Override
165 public T next() {
166 return iterator.next();
167 }
168 };
169 }
170
171 /**
172 * Simply returns its argument.
173 *
174 * @deprecated no need to use this
175 * @since 10.0
176 */
177 @Deprecated public static <T> UnmodifiableIterator<T> unmodifiableIterator(
178 UnmodifiableIterator<T> iterator) {
179 return checkNotNull(iterator);
180 }
181
182 /**
183 * Returns the number of elements remaining in {@code iterator}. The iterator
184 * will be left exhausted: its {@code hasNext()} method will return
185 * {@code false}.
186 */
187 public static int size(Iterator<?> iterator) {
188 int count = 0;
189 while (iterator.hasNext()) {
190 iterator.next();
191 count++;
192 }
193 return count;
194 }
195
196 /**
197 * Returns {@code true} if {@code iterator} contains {@code element}.
198 */
199 public static boolean contains(Iterator<?> iterator, @Nullable Object element) {
200 return any(iterator, equalTo(element));
201 }
202
203 /**
204 * Traverses an iterator and removes every element that belongs to the
205 * provided collection. The iterator will be left exhausted: its
206 * {@code hasNext()} method will return {@code false}.
207 *
208 * @param removeFrom the iterator to (potentially) remove elements from
209 * @param elementsToRemove the elements to remove
210 * @return {@code true} if any element was removed from {@code iterator}
211 */
212 public static boolean removeAll(
213 Iterator<?> removeFrom, Collection<?> elementsToRemove) {
214 return removeIf(removeFrom, in(elementsToRemove));
215 }
216
217 /**
218 * Removes every element that satisfies the provided predicate from the
219 * iterator. The iterator will be left exhausted: its {@code hasNext()}
220 * method will return {@code false}.
221 *
222 * @param removeFrom the iterator to (potentially) remove elements from
223 * @param predicate a predicate that determines whether an element should
224 * be removed
225 * @return {@code true} if any elements were removed from the iterator
226 * @since 2.0
227 */
228 public static <T> boolean removeIf(
229 Iterator<T> removeFrom, Predicate<? super T> predicate) {
230 checkNotNull(predicate);
231 boolean modified = false;
232 while (removeFrom.hasNext()) {
233 if (predicate.apply(removeFrom.next())) {
234 removeFrom.remove();
235 modified = true;
236 }
237 }
238 return modified;
239 }
240
241 /**
242 * Traverses an iterator and removes every element that does not belong to the
243 * provided collection. The iterator will be left exhausted: its
244 * {@code hasNext()} method will return {@code false}.
245 *
246 * @param removeFrom the iterator to (potentially) remove elements from
247 * @param elementsToRetain the elements to retain
248 * @return {@code true} if any element was removed from {@code iterator}
249 */
250 public static boolean retainAll(
251 Iterator<?> removeFrom, Collection<?> elementsToRetain) {
252 return removeIf(removeFrom, not(in(elementsToRetain)));
253 }
254
255 /**
256 * Determines whether two iterators contain equal elements in the same order.
257 * More specifically, this method returns {@code true} if {@code iterator1}
258 * and {@code iterator2} contain the same number of elements and every element
259 * of {@code iterator1} is equal to the corresponding element of
260 * {@code iterator2}.
261 *
262 * <p>Note that this will modify the supplied iterators, since they will have
263 * been advanced some number of elements forward.
264 */
265 public static boolean elementsEqual(
266 Iterator<?> iterator1, Iterator<?> iterator2) {
267 while (iterator1.hasNext()) {
268 if (!iterator2.hasNext()) {
269 return false;
270 }
271 Object o1 = iterator1.next();
272 Object o2 = iterator2.next();
273 if (!Objects.equal(o1, o2)) {
274 return false;
275 }
276 }
277 return !iterator2.hasNext();
278 }
279
280 /**
281 * Returns a string representation of {@code iterator}, with the format
282 * {@code [e1, e2, ..., en]}. The iterator will be left exhausted: its
283 * {@code hasNext()} method will return {@code false}.
284 */
285 public static String toString(Iterator<?> iterator) {
286 return Collections2.STANDARD_JOINER
287 .appendTo(new StringBuilder().append('['), iterator)
288 .append(']')
289 .toString();
290 }
291
292 /**
293 * Returns the single element contained in {@code iterator}.
294 *
295 * @throws NoSuchElementException if the iterator is empty
296 * @throws IllegalArgumentException if the iterator contains multiple
297 * elements. The state of the iterator is unspecified.
298 */
299 public static <T> T getOnlyElement(Iterator<T> iterator) {
300 T first = iterator.next();
301 if (!iterator.hasNext()) {
302 return first;
303 }
304
305 StringBuilder sb = new StringBuilder();
306 sb.append("expected one element but was: <" + first);
307 for (int i = 0; i < 4 && iterator.hasNext(); i++) {
308 sb.append(", " + iterator.next());
309 }
310 if (iterator.hasNext()) {
311 sb.append(", ...");
312 }
313 sb.append('>');
314
315 throw new IllegalArgumentException(sb.toString());
316 }
317
318 /**
319 * Returns the single element contained in {@code iterator}, or {@code
320 * defaultValue} if the iterator is empty.
321 *
322 * @throws IllegalArgumentException if the iterator contains multiple
323 * elements. The state of the iterator is unspecified.
324 */
325 @Nullable
326 public static <T> T getOnlyElement(Iterator<? extends T> iterator, @Nullable T defaultValue) {
327 return iterator.hasNext() ? getOnlyElement(iterator) : defaultValue;
328 }
329
330 /**
331 * Adds all elements in {@code iterator} to {@code collection}. The iterator
332 * will be left exhausted: its {@code hasNext()} method will return
333 * {@code false}.
334 *
335 * @return {@code true} if {@code collection} was modified as a result of this
336 * operation
337 */
338 public static <T> boolean addAll(
339 Collection<T> addTo, Iterator<? extends T> iterator) {
340 checkNotNull(addTo);
341 checkNotNull(iterator);
342 boolean wasModified = false;
343 while (iterator.hasNext()) {
344 wasModified |= addTo.add(iterator.next());
345 }
346 return wasModified;
347 }
348
349 /**
350 * Returns the number of elements in the specified iterator that equal the
351 * specified object. The iterator will be left exhausted: its
352 * {@code hasNext()} method will return {@code false}.
353 *
354 * @see Collections#frequency
355 */
356 public static int frequency(Iterator<?> iterator, @Nullable Object element) {
357 return size(filter(iterator, equalTo(element)));
358 }
359
360 /**
361 * Returns an iterator that cycles indefinitely over the elements of {@code
362 * iterable}.
363 *
364 * <p>The returned iterator supports {@code remove()} if the provided iterator
365 * does. After {@code remove()} is called, subsequent cycles omit the removed
366 * element, which is no longer in {@code iterable}. The iterator's
367 * {@code hasNext()} method returns {@code true} until {@code iterable} is
368 * empty.
369 *
370 * <p><b>Warning:</b> Typical uses of the resulting iterator may produce an
371 * infinite loop. You should use an explicit {@code break} or be certain that
372 * you will eventually remove all the elements.
373 */
374 public static <T> Iterator<T> cycle(final Iterable<T> iterable) {
375 checkNotNull(iterable);
376 return new Iterator<T>() {
377 Iterator<T> iterator = emptyIterator();
378 Iterator<T> removeFrom;
379
380 @Override
381 public boolean hasNext() {
382 if (!iterator.hasNext()) {
383 iterator = iterable.iterator();
384 }
385 return iterator.hasNext();
386 }
387 @Override
388 public T next() {
389 if (!hasNext()) {
390 throw new NoSuchElementException();
391 }
392 removeFrom = iterator;
393 return iterator.next();
394 }
395 @Override
396 public void remove() {
397 checkRemove(removeFrom != null);
398 removeFrom.remove();
399 removeFrom = null;
400 }
401 };
402 }
403
404 /**
405 * Returns an iterator that cycles indefinitely over the provided elements.
406 *
407 * <p>The returned iterator supports {@code remove()}. After {@code remove()}
408 * is called, subsequent cycles omit the removed
409 * element, but {@code elements} does not change. The iterator's
410 * {@code hasNext()} method returns {@code true} until all of the original
411 * elements have been removed.
412 *
413 * <p><b>Warning:</b> Typical uses of the resulting iterator may produce an
414 * infinite loop. You should use an explicit {@code break} or be certain that
415 * you will eventually remove all the elements.
416 */
417 public static <T> Iterator<T> cycle(T... elements) {
418 return cycle(Lists.newArrayList(elements));
419 }
420
421 /**
422 * Combines two iterators into a single iterator. The returned iterator
423 * iterates across the elements in {@code a}, followed by the elements in
424 * {@code b}. The source iterators are not polled until necessary.
425 *
426 * <p>The returned iterator supports {@code remove()} when the corresponding
427 * input iterator supports it.
428 *
429 * <p><b>Note:</b> the current implementation is not suitable for nested
430 * concatenated iterators, i.e. the following should be avoided when in a loop:
431 * {@code iterator = Iterators.concat(iterator, suffix);}, since iteration over the
432 * resulting iterator has a cubic complexity to the depth of the nesting.
433 */
434 public static <T> Iterator<T> concat(Iterator<? extends T> a,
435 Iterator<? extends T> b) {
436 return concat(ImmutableList.of(a, b).iterator());
437 }
438
439 /**
440 * Combines three iterators into a single iterator. The returned iterator
441 * iterates across the elements in {@code a}, followed by the elements in
442 * {@code b}, followed by the elements in {@code c}. The source iterators
443 * are not polled until necessary.
444 *
445 * <p>The returned iterator supports {@code remove()} when the corresponding
446 * input iterator supports it.
447 *
448 * <p><b>Note:</b> the current implementation is not suitable for nested
449 * concatenated iterators, i.e. the following should be avoided when in a loop:
450 * {@code iterator = Iterators.concat(iterator, suffix);}, since iteration over the
451 * resulting iterator has a cubic complexity to the depth of the nesting.
452 */
453 public static <T> Iterator<T> concat(Iterator<? extends T> a,
454 Iterator<? extends T> b, Iterator<? extends T> c) {
455 return concat(ImmutableList.of(a, b, c).iterator());
456 }
457
458 /**
459 * Combines four iterators into a single iterator. The returned iterator
460 * iterates across the elements in {@code a}, followed by the elements in
461 * {@code b}, followed by the elements in {@code c}, followed by the elements
462 * in {@code d}. The source iterators are not polled until necessary.
463 *
464 * <p>The returned iterator supports {@code remove()} when the corresponding
465 * input iterator supports it.
466 *
467 * <p><b>Note:</b> the current implementation is not suitable for nested
468 * concatenated iterators, i.e. the following should be avoided when in a loop:
469 * {@code iterator = Iterators.concat(iterator, suffix);}, since iteration over the
470 * resulting iterator has a cubic complexity to the depth of the nesting.
471 */
472 public static <T> Iterator<T> concat(Iterator<? extends T> a,
473 Iterator<? extends T> b, Iterator<? extends T> c,
474 Iterator<? extends T> d) {
475 return concat(ImmutableList.of(a, b, c, d).iterator());
476 }
477
478 /**
479 * Combines multiple iterators into a single iterator. The returned iterator
480 * iterates across the elements of each iterator in {@code inputs}. The input
481 * iterators are not polled until necessary.
482 *
483 * <p>The returned iterator supports {@code remove()} when the corresponding
484 * input iterator supports it.
485 *
486 * <p><b>Note:</b> the current implementation is not suitable for nested
487 * concatenated iterators, i.e. the following should be avoided when in a loop:
488 * {@code iterator = Iterators.concat(iterator, suffix);}, since iteration over the
489 * resulting iterator has a cubic complexity to the depth of the nesting.
490 *
491 * @throws NullPointerException if any of the provided iterators is null
492 */
493 public static <T> Iterator<T> concat(Iterator<? extends T>... inputs) {
494 return concat(ImmutableList.copyOf(inputs).iterator());
495 }
496
497 /**
498 * Combines multiple iterators into a single iterator. The returned iterator
499 * iterates across the elements of each iterator in {@code inputs}. The input
500 * iterators are not polled until necessary.
501 *
502 * <p>The returned iterator supports {@code remove()} when the corresponding
503 * input iterator supports it. The methods of the returned iterator may throw
504 * {@code NullPointerException} if any of the input iterators is null.
505 *
506 * <p><b>Note:</b> the current implementation is not suitable for nested
507 * concatenated iterators, i.e. the following should be avoided when in a loop:
508 * {@code iterator = Iterators.concat(iterator, suffix);}, since iteration over the
509 * resulting iterator has a cubic complexity to the depth of the nesting.
510 */
511 public static <T> Iterator<T> concat(
512 final Iterator<? extends Iterator<? extends T>> inputs) {
513 checkNotNull(inputs);
514 return new Iterator<T>() {
515 Iterator<? extends T> current = emptyIterator();
516 Iterator<? extends T> removeFrom;
517
518 @Override
519 public boolean hasNext() {
520 // http://code.google.com/p/google-collections/issues/detail?id=151
521 // current.hasNext() might be relatively expensive, worth minimizing.
522 boolean currentHasNext;
523 // checkNotNull eager for GWT
524 // note: it must be here & not where 'current' is assigned,
525 // because otherwise we'll have called inputs.next() before throwing
526 // the first NPE, and the next time around we'll call inputs.next()
527 // again, incorrectly moving beyond the error.
528 while (!(currentHasNext = checkNotNull(current).hasNext())
529 && inputs.hasNext()) {
530 current = inputs.next();
531 }
532 return currentHasNext;
533 }
534 @Override
535 public T next() {
536 if (!hasNext()) {
537 throw new NoSuchElementException();
538 }
539 removeFrom = current;
540 return current.next();
541 }
542 @Override
543 public void remove() {
544 checkRemove(removeFrom != null);
545 removeFrom.remove();
546 removeFrom = null;
547 }
548 };
549 }
550
551 /**
552 * Divides an iterator into unmodifiable sublists of the given size (the final
553 * list may be smaller). For example, partitioning an iterator containing
554 * {@code [a, b, c, d, e]} with a partition size of 3 yields {@code
555 * [[a, b, c], [d, e]]} -- an outer iterator containing two inner lists of
556 * three and two elements, all in the original order.
557 *
558 * <p>The returned lists implement {@link java.util.RandomAccess}.
559 *
560 * @param iterator the iterator to return a partitioned view of
561 * @param size the desired size of each partition (the last may be smaller)
562 * @return an iterator of immutable lists containing the elements of {@code
563 * iterator} divided into partitions
564 * @throws IllegalArgumentException if {@code size} is nonpositive
565 */
566 public static <T> UnmodifiableIterator<List<T>> partition(
567 Iterator<T> iterator, int size) {
568 return partitionImpl(iterator, size, false);
569 }
570
571 /**
572 * Divides an iterator into unmodifiable sublists of the given size, padding
573 * the final iterator with null values if necessary. For example, partitioning
574 * an iterator containing {@code [a, b, c, d, e]} with a partition size of 3
575 * yields {@code [[a, b, c], [d, e, null]]} -- an outer iterator containing
576 * two inner lists of three elements each, all in the original order.
577 *
578 * <p>The returned lists implement {@link java.util.RandomAccess}.
579 *
580 * @param iterator the iterator to return a partitioned view of
581 * @param size the desired size of each partition
582 * @return an iterator of immutable lists containing the elements of {@code
583 * iterator} divided into partitions (the final iterable may have
584 * trailing null elements)
585 * @throws IllegalArgumentException if {@code size} is nonpositive
586 */
587 public static <T> UnmodifiableIterator<List<T>> paddedPartition(
588 Iterator<T> iterator, int size) {
589 return partitionImpl(iterator, size, true);
590 }
591
592 private static <T> UnmodifiableIterator<List<T>> partitionImpl(
593 final Iterator<T> iterator, final int size, final boolean pad) {
594 checkNotNull(iterator);
595 checkArgument(size > 0);
596 return new UnmodifiableIterator<List<T>>() {
597 @Override
598 public boolean hasNext() {
599 return iterator.hasNext();
600 }
601 @Override
602 public List<T> next() {
603 if (!hasNext()) {
604 throw new NoSuchElementException();
605 }
606 Object[] array = new Object[size];
607 int count = 0;
608 for (; count < size && iterator.hasNext(); count++) {
609 array[count] = iterator.next();
610 }
611 for (int i = count; i < size; i++) {
612 array[i] = null; // for GWT
613 }
614
615 @SuppressWarnings("unchecked") // we only put Ts in it
616 List<T> list = Collections.unmodifiableList(
617 (List<T>) Arrays.asList(array));
618 return (pad || count == size) ? list : list.subList(0, count);
619 }
620 };
621 }
622
623 /**
624 * Returns the elements of {@code unfiltered} that satisfy a predicate.
625 */
626 public static <T> UnmodifiableIterator<T> filter(
627 final Iterator<T> unfiltered, final Predicate<? super T> predicate) {
628 checkNotNull(unfiltered);
629 checkNotNull(predicate);
630 return new AbstractIterator<T>() {
631 @Override protected T computeNext() {
632 while (unfiltered.hasNext()) {
633 T element = unfiltered.next();
634 if (predicate.apply(element)) {
635 return element;
636 }
637 }
638 return endOfData();
639 }
640 };
641 }
642
643 /**
644 * Returns {@code true} if one or more elements returned by {@code iterator}
645 * satisfy the given predicate.
646 */
647 public static <T> boolean any(
648 Iterator<T> iterator, Predicate<? super T> predicate) {
649 return indexOf(iterator, predicate) != -1;
650 }
651
652 /**
653 * Returns {@code true} if every element returned by {@code iterator}
654 * satisfies the given predicate. If {@code iterator} is empty, {@code true}
655 * is returned.
656 */
657 public static <T> boolean all(
658 Iterator<T> iterator, Predicate<? super T> predicate) {
659 checkNotNull(predicate);
660 while (iterator.hasNext()) {
661 T element = iterator.next();
662 if (!predicate.apply(element)) {
663 return false;
664 }
665 }
666 return true;
667 }
668
669 /**
670 * Returns the first element in {@code iterator} that satisfies the given
671 * predicate; use this method only when such an element is known to exist. If
672 * no such element is found, the iterator will be left exhausted: its {@code
673 * hasNext()} method will return {@code false}. If it is possible that
674 * <i>no</i> element will match, use {@link #tryFind} or {@link
675 * #find(Iterator, Predicate, Object)} instead.
676 *
677 * @throws NoSuchElementException if no element in {@code iterator} matches
678 * the given predicate
679 */
680 public static <T> T find(
681 Iterator<T> iterator, Predicate<? super T> predicate) {
682 return filter(iterator, predicate).next();
683 }
684
685 /**
686 * Returns the first element in {@code iterator} that satisfies the given
687 * predicate. If no such element is found, {@code defaultValue} will be
688 * returned from this method and the iterator will be left exhausted: its
689 * {@code hasNext()} method will return {@code false}. Note that this can
690 * usually be handled more naturally using {@code
691 * tryFind(iterator, predicate).or(defaultValue)}.
692 *
693 * @since 7.0
694 */
695 @Nullable
696 public static <T> T find(Iterator<? extends T> iterator, Predicate<? super T> predicate,
697 @Nullable T defaultValue) {
698 return getNext(filter(iterator, predicate), defaultValue);
699 }
700
701 /**
702 * Returns an {@link Optional} containing the first element in {@code
703 * iterator} that satisfies the given predicate, if such an element exists. If
704 * no such element is found, an empty {@link Optional} will be returned from
705 * this method and the iterator will be left exhausted: its {@code
706 * hasNext()} method will return {@code false}.
707 *
708 * <p><b>Warning:</b> avoid using a {@code predicate} that matches {@code
709 * null}. If {@code null} is matched in {@code iterator}, a
710 * NullPointerException will be thrown.
711 *
712 * @since 11.0
713 */
714 public static <T> Optional<T> tryFind(
715 Iterator<T> iterator, Predicate<? super T> predicate) {
716 UnmodifiableIterator<T> filteredIterator = filter(iterator, predicate);
717 return filteredIterator.hasNext()
718 ? Optional.of(filteredIterator.next())
719 : Optional.<T>absent();
720 }
721
722 /**
723 * Returns the index in {@code iterator} of the first element that satisfies
724 * the provided {@code predicate}, or {@code -1} if the Iterator has no such
725 * elements.
726 *
727 * <p>More formally, returns the lowest index {@code i} such that
728 * {@code predicate.apply(Iterators.get(iterator, i))} returns {@code true},
729 * or {@code -1} if there is no such index.
730 *
731 * <p>If -1 is returned, the iterator will be left exhausted: its
732 * {@code hasNext()} method will return {@code false}. Otherwise,
733 * the iterator will be set to the element which satisfies the
734 * {@code predicate}.
735 *
736 * @since 2.0
737 */
738 public static <T> int indexOf(
739 Iterator<T> iterator, Predicate<? super T> predicate) {
740 checkNotNull(predicate, "predicate");
741 for (int i = 0; iterator.hasNext(); i++) {
742 T current = iterator.next();
743 if (predicate.apply(current)) {
744 return i;
745 }
746 }
747 return -1;
748 }
749
750 /**
751 * Returns an iterator that applies {@code function} to each element of {@code
752 * fromIterator}.
753 *
754 * <p>The returned iterator supports {@code remove()} if the provided iterator
755 * does. After a successful {@code remove()} call, {@code fromIterator} no
756 * longer contains the corresponding element.
757 */
758 public static <F, T> Iterator<T> transform(final Iterator<F> fromIterator,
759 final Function<? super F, ? extends T> function) {
760 checkNotNull(function);
761 return new TransformedIterator<F, T>(fromIterator) {
762 @Override
763 T transform(F from) {
764 return function.apply(from);
765 }
766 };
767 }
768
769 /**
770 * Advances {@code iterator} {@code position + 1} times, returning the
771 * element at the {@code position}th position.
772 *
773 * @param position position of the element to return
774 * @return the element at the specified position in {@code iterator}
775 * @throws IndexOutOfBoundsException if {@code position} is negative or
776 * greater than or equal to the number of elements remaining in
777 * {@code iterator}
778 */
779 public static <T> T get(Iterator<T> iterator, int position) {
780 checkNonnegative(position);
781 int skipped = advance(iterator, position);
782 if (!iterator.hasNext()) {
783 throw new IndexOutOfBoundsException("position (" + position
784 + ") must be less than the number of elements that remained ("
785 + skipped + ")");
786 }
787 return iterator.next();
788 }
789
790 static void checkNonnegative(int position) {
791 if (position < 0) {
792 throw new IndexOutOfBoundsException("position (" + position
793 + ") must not be negative");
794 }
795 }
796
797 /**
798 * Advances {@code iterator} {@code position + 1} times, returning the
799 * element at the {@code position}th position or {@code defaultValue}
800 * otherwise.
801 *
802 * @param position position of the element to return
803 * @param defaultValue the default value to return if the iterator is empty
804 * or if {@code position} is greater than the number of elements
805 * remaining in {@code iterator}
806 * @return the element at the specified position in {@code iterator} or
807 * {@code defaultValue} if {@code iterator} produces fewer than
808 * {@code position + 1} elements.
809 * @throws IndexOutOfBoundsException if {@code position} is negative
810 * @since 4.0
811 */
812 @Nullable
813 public static <T> T get(Iterator<? extends T> iterator, int position, @Nullable T defaultValue) {
814 checkNonnegative(position);
815 advance(iterator, position);
816 return getNext(iterator, defaultValue);
817 }
818
819 /**
820 * Returns the next element in {@code iterator} or {@code defaultValue} if
821 * the iterator is empty. The {@link Iterables} analog to this method is
822 * {@link Iterables#getFirst}.
823 *
824 * @param defaultValue the default value to return if the iterator is empty
825 * @return the next element of {@code iterator} or the default value
826 * @since 7.0
827 */
828 @Nullable
829 public static <T> T getNext(Iterator<? extends T> iterator, @Nullable T defaultValue) {
830 return iterator.hasNext() ? iterator.next() : defaultValue;
831 }
832
833 /**
834 * Advances {@code iterator} to the end, returning the last element.
835 *
836 * @return the last element of {@code iterator}
837 * @throws NoSuchElementException if the iterator is empty
838 */
839 public static <T> T getLast(Iterator<T> iterator) {
840 while (true) {
841 T current = iterator.next();
842 if (!iterator.hasNext()) {
843 return current;
844 }
845 }
846 }
847
848 /**
849 * Advances {@code iterator} to the end, returning the last element or
850 * {@code defaultValue} if the iterator is empty.
851 *
852 * @param defaultValue the default value to return if the iterator is empty
853 * @return the last element of {@code iterator}
854 * @since 3.0
855 */
856 @Nullable
857 public static <T> T getLast(Iterator<? extends T> iterator, @Nullable T defaultValue) {
858 return iterator.hasNext() ? getLast(iterator) : defaultValue;
859 }
860
861 /**
862 * Calls {@code next()} on {@code iterator}, either {@code numberToAdvance} times
863 * or until {@code hasNext()} returns {@code false}, whichever comes first.
864 *
865 * @return the number of elements the iterator was advanced
866 * @since 13.0 (since 3.0 as {@code Iterators.skip})
867 */
868 public static int advance(Iterator<?> iterator, int numberToAdvance) {
869 checkNotNull(iterator);
870 checkArgument(numberToAdvance >= 0, "numberToAdvance must be nonnegative");
871
872 int i;
873 for (i = 0; i < numberToAdvance && iterator.hasNext(); i++) {
874 iterator.next();
875 }
876 return i;
877 }
878
879 /**
880 * Creates an iterator returning the first {@code limitSize} elements of the
881 * given iterator. If the original iterator does not contain that many
882 * elements, the returned iterator will have the same behavior as the original
883 * iterator. The returned iterator supports {@code remove()} if the original
884 * iterator does.
885 *
886 * @param iterator the iterator to limit
887 * @param limitSize the maximum number of elements in the returned iterator
888 * @throws IllegalArgumentException if {@code limitSize} is negative
889 * @since 3.0
890 */
891 public static <T> Iterator<T> limit(
892 final Iterator<T> iterator, final int limitSize) {
893 checkNotNull(iterator);
894 checkArgument(limitSize >= 0, "limit is negative");
895 return new Iterator<T>() {
896 private int count;
897
898 @Override
899 public boolean hasNext() {
900 return count < limitSize && iterator.hasNext();
901 }
902
903 @Override
904 public T next() {
905 if (!hasNext()) {
906 throw new NoSuchElementException();
907 }
908 count++;
909 return iterator.next();
910 }
911
912 @Override
913 public void remove() {
914 iterator.remove();
915 }
916 };
917 }
918
919 /**
920 * Returns a view of the supplied {@code iterator} that removes each element
921 * from the supplied {@code iterator} as it is returned.
922 *
923 * <p>The provided iterator must support {@link Iterator#remove()} or
924 * else the returned iterator will fail on the first call to {@code
925 * next}.
926 *
927 * @param iterator the iterator to remove and return elements from
928 * @return an iterator that removes and returns elements from the
929 * supplied iterator
930 * @since 2.0
931 */
932 public static <T> Iterator<T> consumingIterator(final Iterator<T> iterator) {
933 checkNotNull(iterator);
934 return new UnmodifiableIterator<T>() {
935 @Override
936 public boolean hasNext() {
937 return iterator.hasNext();
938 }
939
940 @Override
941 public T next() {
942 T next = iterator.next();
943 iterator.remove();
944 return next;
945 }
946
947 @Override
948 public String toString() {
949 return "Iterators.consumingIterator(...)";
950 }
951 };
952 }
953
954 /**
955 * Deletes and returns the next value from the iterator, or returns
956 * {@code null} if there is no such value.
957 */
958 @Nullable
959 static <T> T pollNext(Iterator<T> iterator) {
960 if (iterator.hasNext()) {
961 T result = iterator.next();
962 iterator.remove();
963 return result;
964 } else {
965 return null;
966 }
967 }
968
969 // Methods only in Iterators, not in Iterables
970
971 /**
972 * Clears the iterator using its remove method.
973 */
974 static void clear(Iterator<?> iterator) {
975 checkNotNull(iterator);
976 while (iterator.hasNext()) {
977 iterator.next();
978 iterator.remove();
979 }
980 }
981
982 /**
983 * Returns an iterator containing the elements of {@code array} in order. The
984 * returned iterator is a view of the array; subsequent changes to the array
985 * will be reflected in the iterator.
986 *
987 * <p><b>Note:</b> It is often preferable to represent your data using a
988 * collection type, for example using {@link Arrays#asList(Object[])}, making
989 * this method unnecessary.
990 *
991 * <p>The {@code Iterable} equivalent of this method is either {@link
992 * Arrays#asList(Object[])}, {@link ImmutableList#copyOf(Object[])}},
993 * or {@link ImmutableList#of}.
994 */
995 public static <T> UnmodifiableIterator<T> forArray(final T... array) {
996 return forArray(array, 0, array.length, 0);
997 }
998
999 /**
1000 * Returns a list iterator containing the elements in the specified range of
1001 * {@code array} in order, starting at the specified index.
1002 *
1003 * <p>The {@code Iterable} equivalent of this method is {@code
1004 * Arrays.asList(array).subList(offset, offset + length).listIterator(index)}.
1005 */
1006 static <T> UnmodifiableListIterator<T> forArray(
1007 final T[] array, final int offset, int length, int index) {
1008 checkArgument(length >= 0);
1009 int end = offset + length;
1010
1011 // Technically we should give a slightly more descriptive error on overflow
1012 Preconditions.checkPositionIndexes(offset, end, array.length);
1013 Preconditions.checkPositionIndex(index, length);
1014 if (length == 0) {
1015 return emptyListIterator();
1016 }
1017
1018 /*
1019 * We can't use call the two-arg constructor with arguments (offset, end)
1020 * because the returned Iterator is a ListIterator that may be moved back
1021 * past the beginning of the iteration.
1022 */
1023 return new AbstractIndexedListIterator<T>(length, index) {
1024 @Override protected T get(int index) {
1025 return array[offset + index];
1026 }
1027 };
1028 }
1029
1030 /**
1031 * Returns an iterator containing only {@code value}.
1032 *
1033 * <p>The {@link Iterable} equivalent of this method is {@link
1034 * Collections#singleton}.
1035 */
1036 public static <T> UnmodifiableIterator<T> singletonIterator(
1037 @Nullable final T value) {
1038 return new UnmodifiableIterator<T>() {
1039 boolean done;
1040 @Override
1041 public boolean hasNext() {
1042 return !done;
1043 }
1044 @Override
1045 public T next() {
1046 if (done) {
1047 throw new NoSuchElementException();
1048 }
1049 done = true;
1050 return value;
1051 }
1052 };
1053 }
1054
1055 /**
1056 * Adapts an {@code Enumeration} to the {@code Iterator} interface.
1057 *
1058 * <p>This method has no equivalent in {@link Iterables} because viewing an
1059 * {@code Enumeration} as an {@code Iterable} is impossible. However, the
1060 * contents can be <i>copied</i> into a collection using {@link
1061 * Collections#list}.
1062 */
1063 public static <T> UnmodifiableIterator<T> forEnumeration(
1064 final Enumeration<T> enumeration) {
1065 checkNotNull(enumeration);
1066 return new UnmodifiableIterator<T>() {
1067 @Override
1068 public boolean hasNext() {
1069 return enumeration.hasMoreElements();
1070 }
1071 @Override
1072 public T next() {
1073 return enumeration.nextElement();
1074 }
1075 };
1076 }
1077
1078 /**
1079 * Adapts an {@code Iterator} to the {@code Enumeration} interface.
1080 *
1081 * <p>The {@code Iterable} equivalent of this method is either {@link
1082 * Collections#enumeration} (if you have a {@link Collection}), or
1083 * {@code Iterators.asEnumeration(collection.iterator())}.
1084 */
1085 public static <T> Enumeration<T> asEnumeration(final Iterator<T> iterator) {
1086 checkNotNull(iterator);
1087 return new Enumeration<T>() {
1088 @Override
1089 public boolean hasMoreElements() {
1090 return iterator.hasNext();
1091 }
1092 @Override
1093 public T nextElement() {
1094 return iterator.next();
1095 }
1096 };
1097 }
1098
1099 /**
1100 * Implementation of PeekingIterator that avoids peeking unless necessary.
1101 */
1102 private static class PeekingImpl<E> implements PeekingIterator<E> {
1103
1104 private final Iterator<? extends E> iterator;
1105 private boolean hasPeeked;
1106 private E peekedElement;
1107
1108 public PeekingImpl(Iterator<? extends E> iterator) {
1109 this.iterator = checkNotNull(iterator);
1110 }
1111
1112 @Override
1113 public boolean hasNext() {
1114 return hasPeeked || iterator.hasNext();
1115 }
1116
1117 @Override
1118 public E next() {
1119 if (!hasPeeked) {
1120 return iterator.next();
1121 }
1122 E result = peekedElement;
1123 hasPeeked = false;
1124 peekedElement = null;
1125 return result;
1126 }
1127
1128 @Override
1129 public void remove() {
1130 checkState(!hasPeeked, "Can't remove after you've peeked at next");
1131 iterator.remove();
1132 }
1133
1134 @Override
1135 public E peek() {
1136 if (!hasPeeked) {
1137 peekedElement = iterator.next();
1138 hasPeeked = true;
1139 }
1140 return peekedElement;
1141 }
1142 }
1143
1144 /**
1145 * Returns a {@code PeekingIterator} backed by the given iterator.
1146 *
1147 * <p>Calls to the {@code peek} method with no intervening calls to {@code
1148 * next} do not affect the iteration, and hence return the same object each
1149 * time. A subsequent call to {@code next} is guaranteed to return the same
1150 * object again. For example: <pre> {@code
1151 *
1152 * PeekingIterator<String> peekingIterator =
1153 * Iterators.peekingIterator(Iterators.forArray("a", "b"));
1154 * String a1 = peekingIterator.peek(); // returns "a"
1155 * String a2 = peekingIterator.peek(); // also returns "a"
1156 * String a3 = peekingIterator.next(); // also returns "a"}</pre>
1157 *
1158 * <p>Any structural changes to the underlying iteration (aside from those
1159 * performed by the iterator's own {@link PeekingIterator#remove()} method)
1160 * will leave the iterator in an undefined state.
1161 *
1162 * <p>The returned iterator does not support removal after peeking, as
1163 * explained by {@link PeekingIterator#remove()}.
1164 *
1165 * <p>Note: If the given iterator is already a {@code PeekingIterator},
1166 * it <i>might</i> be returned to the caller, although this is neither
1167 * guaranteed to occur nor required to be consistent. For example, this
1168 * method <i>might</i> choose to pass through recognized implementations of
1169 * {@code PeekingIterator} when the behavior of the implementation is
1170 * known to meet the contract guaranteed by this method.
1171 *
1172 * <p>There is no {@link Iterable} equivalent to this method, so use this
1173 * method to wrap each individual iterator as it is generated.
1174 *
1175 * @param iterator the backing iterator. The {@link PeekingIterator} assumes
1176 * ownership of this iterator, so users should cease making direct calls
1177 * to it after calling this method.
1178 * @return a peeking iterator backed by that iterator. Apart from the
1179 * additional {@link PeekingIterator#peek()} method, this iterator behaves
1180 * exactly the same as {@code iterator}.
1181 */
1182 public static <T> PeekingIterator<T> peekingIterator(
1183 Iterator<? extends T> iterator) {
1184 if (iterator instanceof PeekingImpl) {
1185 // Safe to cast <? extends T> to <T> because PeekingImpl only uses T
1186 // covariantly (and cannot be subclassed to add non-covariant uses).
1187 @SuppressWarnings("unchecked")
1188 PeekingImpl<T> peeking = (PeekingImpl<T>) iterator;
1189 return peeking;
1190 }
1191 return new PeekingImpl<T>(iterator);
1192 }
1193
1194 /**
1195 * Simply returns its argument.
1196 *
1197 * @deprecated no need to use this
1198 * @since 10.0
1199 */
1200 @Deprecated public static <T> PeekingIterator<T> peekingIterator(
1201 PeekingIterator<T> iterator) {
1202 return checkNotNull(iterator);
1203 }
1204
1205 /**
1206 * Returns an iterator over the merged contents of all given
1207 * {@code iterators}, traversing every element of the input iterators.
1208 * Equivalent entries will not be de-duplicated.
1209 *
1210 * <p>Callers must ensure that the source {@code iterators} are in
1211 * non-descending order as this method does not sort its input.
1212 *
1213 * <p>For any equivalent elements across all {@code iterators}, it is
1214 * undefined which element is returned first.
1215 *
1216 * @since 11.0
1217 */
1218 @Beta
1219 public static <T> UnmodifiableIterator<T> mergeSorted(
1220 Iterable<? extends Iterator<? extends T>> iterators,
1221 Comparator<? super T> comparator) {
1222 checkNotNull(iterators, "iterators");
1223 checkNotNull(comparator, "comparator");
1224
1225 return new MergingIterator<T>(iterators, comparator);
1226 }
1227
1228 /**
1229 * An iterator that performs a lazy N-way merge, calculating the next value
1230 * each time the iterator is polled. This amortizes the sorting cost over the
1231 * iteration and requires less memory than sorting all elements at once.
1232 *
1233 * <p>Retrieving a single element takes approximately O(log(M)) time, where M
1234 * is the number of iterators. (Retrieving all elements takes approximately
1235 * O(N*log(M)) time, where N is the total number of elements.)
1236 */
1237 private static class MergingIterator<T> extends UnmodifiableIterator<T> {
1238 final Queue<PeekingIterator<T>> queue;
1239
1240 public MergingIterator(Iterable<? extends Iterator<? extends T>> iterators,
1241 final Comparator<? super T> itemComparator) {
1242 // A comparator that's used by the heap, allowing the heap
1243 // to be sorted based on the top of each iterator.
1244 Comparator<PeekingIterator<T>> heapComparator =
1245 new Comparator<PeekingIterator<T>>() {
1246 @Override
1247 public int compare(PeekingIterator<T> o1, PeekingIterator<T> o2) {
1248 return itemComparator.compare(o1.peek(), o2.peek());
1249 }
1250 };
1251
1252 queue = new PriorityQueue<PeekingIterator<T>>(2, heapComparator);
1253
1254 for (Iterator<? extends T> iterator : iterators) {
1255 if (iterator.hasNext()) {
1256 queue.add(Iterators.peekingIterator(iterator));
1257 }
1258 }
1259 }
1260
1261 @Override
1262 public boolean hasNext() {
1263 return !queue.isEmpty();
1264 }
1265
1266 @Override
1267 public T next() {
1268 PeekingIterator<T> nextIter = queue.remove();
1269 T next = nextIter.next();
1270 if (nextIter.hasNext()) {
1271 queue.add(nextIter);
1272 }
1273 return next;
1274 }
1275 }
1276
1277 /**
1278 * Used to avoid http://bugs.sun.com/view_bug.do?bug_id=6558557
1279 */
1280 static <T> ListIterator<T> cast(Iterator<T> iterator) {
1281 return (ListIterator<T>) iterator;
1282 }
1283 }